Gopher Proxy
gopher.conman.org:70 gopher.conman.org:70/0Gopher:Ext:mod_blog/html.peg
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
#########################################################################
#
# Copyright 2020 by Sean Conner. All Rights Reserved.
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#
# Comments, questions and criticisms can be sent to: sean@conman.org
#
########################################################################
BODY <- flow+ !.
flow <- block / inline
# **************************************
# INLINE tags
# **************************************
inline <- fontstyle / phrase / special / iINS / formctrl / iDEL / Cinline / PCDATA
fontstyle <- TT / I / B / BIG / SMALL / U
phrase <- EM / STRONG / DFN / CODE / SAMP / KBD / VAR / CITE / ABBR / ACRONYM
special <- A / IMG / BR / SCRIPT / BDO / Q / SUB / SUP / SPAN / OBJECT / FONT / MAP
formctrl <- INPUT / SELECT / TEXTAREA / LABEL / BUTTON
TT <- "<" _TT & ET { tagi(yy,"tt"); } attrs* S* ">" inline* "</" _TT ">" { endtag(yy); }
I <- "<" _I & ET { tagi(yy,"i"); } attrs* S* ">" inline* "</" _I ">" { endtag(yy); }
B <- "<" _B & ET { tagi(yy,"b"); } attrs* S* ">" inline* "</" _B ">" { endtag(yy); }
BIG <- "<" _BIG & ET { tagi(yy,"big"); } attrs* S* ">" inline* "</" _BIG ">" { endtag(yy); }
SMALL <- "<" _SMALL & ET { tagi(yy,"small"); } attrs* S* ">" inline* "</" _SMALL ">" { endtag(yy); }
U <- "<" _U & ET { tagi(yy,"u"); } attrs* S* ">" inline* "</" _U ">" { endtag(yy); } # XXX non-standard
EM <- "<" _EM & ET { tagi(yy,"em"); } attrs* S* ">" inline* "</" _EM ">" { endtag(yy); }
STRONG <- "<" _STRONG & ET { tagi(yy,"strong"); } attrs* S* ">" inline* "</" _STRONG ">" { endtag(yy); }
DFN <- "<" _DFN & ET { tagi(yy,"dfn"); } attrs* S* ">" inline* "</" _DFN ">" { endtag(yy); }
CODE <- "<" _CODE & ET { tagi(yy,"code"); } attrs* S* ">" inline* "</" _CODE ">" { endtag(yy); }
SAMP <- "<" _SAMP & ET { tagi(yy,"samp"); } attrs* S* ">" inline* "</" _SAMP ">" { endtag(yy); }
KBD <- "<" _KBD & ET { tagi(yy,"kbd"); } attrs* S* ">" inline* "</" _KBD ">" { endtag(yy); }
VAR <- "<" _VAR & ET { tagi(yy,"var"); } attrs* S* ">" inline* "</" _VAR ">" { endtag(yy); }
CITE <- "<" _CITE & ET { tagi(yy,"cite"); } attrs* S* ">" inline* "</" _CITE ">" { endtag(yy); }
ABBR <- "<" _ABBR & ET { tagi(yy,"abbr"); } attrs* S* ">" inline* "</" _ABBR ">" { endtag(yy); }
ACRONYM <- "<" _ACRONYM & ET { tagi(yy,"acronym"); } attrs* S* ">" inline* "</" _ACRONYM ">" { endtag(yy); }
A <- "<" _A & ET { tagi(yy,"a"); } A_attr* S* ">" (!A inline)* "</" _A ">" { endtag(yy); }
IMG <- "<" _IMG & ET { tagi(yy,"img"); } IMG_attr* S* ">" (S* "</" _IMG ">")? { endtag(yy); }
BR <- "<" _BR & ET { tagi(yy,"br"); } coreattrs* S* ">" (S* "</" _BR ">")? { endtag(yy); }
SCRIPT <- "<" _SCRIPT & ET { tagi(yy,"script"); } SCRIPT_attr* S* ">" scriptDATA "</" _SCRIPT ">" { endtag(yy); }
BDO <- "<" _BDO & ET { tagi(yy,"bdo"); } BDO_attr* S* ">" inline* "</" _BDO ">" { endtag(yy); }
Q <- "<" _Q & ET { tagi(yy,"q"); } Q_attr* S* ">" inline* "</" _Q ">" { endtag(yy); }
SUB <- "<" _SUB & ET { tagi(yy,"sub"); } attrs* S* ">" inline* "</" _SUB ">" { endtag(yy); }
SUP <- "<" _SUP & ET { tagi(yy,"sup"); } attrs* S* ">" inline* "</" _SUP ">" { endtag(yy); }
SPAN <- "<" _SPAN & ET { tagi(yy,"span"); } attrs* S* ">" inline* "</" _SPAN ">" { endtag(yy); }
OBJECT <- "<" _OBJECT & ET { tagi(yy,"object"); } OBJECT_attr* S* ">" object_flow* "</" _OBJECT ">" { endtag(yy); }
PARAM <- "<" _PARAM & ET { tagi(yy,"param"); } PARAM_attr* S* ">" (S* "</" _PARAM ">")? { endtag(yy); }
FONT <- "<" _FONT & ET { tagi(yy,"font"); } FONT_attr* S* ">" inline* "</" _FONT ">" { endtag(yy); }
MAP <- "<" _MAP & ET { tagi(yy,"map"); } MAP_attr* S* ">" map_flow+ "</" _MAP ">" { endtag(yy); }
AREA <- "<" _AREA & ET { tagi(yy,"area"); } AREA_attr* S* ">" (S* "</" _AREA ">")? { endtag(yy); }
INPUT <- "<" _INPUT & ET { tagi(yy,"input"); } INPUT_attr* S* ">" (S* "</" _INPUT ">")? { endtag(yy); }
SELECT <- "<" _SELECT & ET { tagi(yy,"select"); } SELECT_attr* S* ">" select_flow+ "</" _SELECT ">" { endtag(yy); }
TEXTAREA <- "<" _TEXTAREA & ET { tagi(yy,"textarea"); } TEXTAREA_attr* S* ">" PCDATA* "</" _TEXTAREA ">" { endtag(yy); }
LABEL <- "<" _LABEL & ET { tagi(yy,"label"); } LABEL_attr* S* ">" (! LABEL inline)* "</" _LABEL ">" { endtag(yy); }
BUTTON <- "<" _BUTTON & ET { tagi(yy,"button"); } BUTTON_attr* S* ">" button_flow* "</" _BUTTON ">" { endtag(yy); }
OPTGROUP <- "<" _OPTGROUP & ET { tagi(yy,"optgroup"); } OPTGROUP_attr* S* ">" (OPTION / S)+ "</" _OPTGROUP ">" { endtag(yy); }
OPTION <- "<" _OPTION & ET { tagi(yy,"option"); } OPTION_attr* S* ">" PCDATA* "</" _OPTION ">" { endtag(yy); }
iINS <- "<" _INS & ET { tagi(yy,"ins"); } INSDEL_attr* S* ">" flow* "</" _INS ">" { endtag(yy); }
iDEL <- "<" _DEL & ET { tagi(yy,"del"); } INSDEL_attr* S* ">" flow* "</" _DEL ">" { endtag(yy); }
object_flow <- PARAM / flow
map_flow <- block / AREA / S
select_flow <- OPTGROUP / OPTION / S
button_flow <- ! (A / formctrl / FORM / FIELDSET) flow
# *************************************
# BLOCK tags
# *************************************
block <- P / PRE / DL / NOSCRIPT / BLOCKQUOTE
/ FORM / HR / TABLE / FIELDSET / ADDRESS
/ H1 / H2 / H3 / H4 / H5
/ H6 / UL / OL / DIV
/ bINS / bDEL / Cblock
BLOCKQUOTE <- S* "<" _BLOCKQUOTE & ET { tagb(yy,"blockquote"); } bq_attr* S* ">" S* bq_flow+ "</" _BLOCKQUOTE ">" S* { endtag(yy); }
P <- S* "<" _P & ET { tagb(yy,"p"); } attrs* S* ">" S* inline* ("</" _P ">" S*)? { endtag(yy); }
HR <- S* "<" _HR & ET { tagb(yy,"hr"); } attrs* S* ">" S* ("</" _HR ">" S*)? { endtag(yy); }
ADDRESS <- S* "<" _ADDRESS & ET { tagb(yy,"address"); } attrs* S* ">" S* inline* "</" _ADDRESS ">" S* { endtag(yy); }
H1 <- S* "<" _H1 & ET { tagb(yy,"h1"); } attrs* S* ">" S* inline* "</" _H1 ">" S* { endtag(yy); }
H2 <- S* "<" _H2 & ET { tagb(yy,"h2"); } attrs* S* ">" S* inline* "</" _H2 ">" S* { endtag(yy); }
H3 <- S* "<" _H3 & ET { tagb(yy,"h3"); } attrs* S* ">" S* inline* "</" _H3 ">" S* { endtag(yy); }
H4 <- S* "<" _H4 & ET { tagb(yy,"h4"); } attrs* S* ">" S* inline* "</" _H4 ">" S* { endtag(yy); }
H5 <- S* "<" _H5 & ET { tagb(yy,"h5"); } attrs* S* ">" S* inline* "</" _H5 ">" S* { endtag(yy); }
H6 <- S* "<" _H6 & ET { tagb(yy,"h6"); } attrs* S* ">" S* inline* "</" _H6 ">" S* { endtag(yy); }
DIV <- S* "<" _DIV & ET { tagb(yy,"div"); } div_attr* S* ">" S* flow* "</" _DIV ">" S* { endtag(yy); }
DL <- S* "<" _DL & ET { tagb(yy,"dl"); } attrs* S* ">" S* (DT / DD)+ "</" _DL ">" S* { endtag(yy); }
DT <- S* "<" _DT & ET { tagb(yy,"dt"); } attrs* S* ">" S* inline* ("</" _DT ">" S*)? { endtag(yy); }
DD <- S* "<" _DD & ET { tagb(yy,"dd"); } attrs* S* ">" S* flow* ("</" _DD ">" S*)? { endtag(yy); }
UL <- S* "<" _UL & ET { tagb(yy,"ul"); } attrs* S* ">" S* (LI / Cblock)+ "</" _UL ">" S* { endtag(yy); }
OL <- S* "<" _OL & ET { tagb(yy,"ol"); } OL_attr* S* ">" S* (LI / Cblock)+ "</" _OL ">" S* { endtag(yy); }
LI <- S* "<" _LI & ET { tagb(yy,"li"); } attrs* S* ">" S* flow* ("</" _LI ">" S*)? { endtag(yy); }
NOSCRIPT <- S* "<" _NOSCRIPT & ET { tagb(yy,"noscript"); } attrs* S* ">" S* block+ "</" _NOSCRIPT ">" S* { endtag(yy); }
FORM <- S* "<" _FORM & ET { tagb(yy,"form"); } FORM_attr* S* ">" S* FORM_flow* "</" _FORM ">" S* { endtag(yy); }
FIELDSET <- S* "<" _FIELDSET & ET { tagb(yy,"fieldset"); } attrs* S* ">" S* fs_flow* "</" _FIELDSET ">" S* { endtag(yy); }
LEGEND <- S* "<" _LEGEND & ET { tagb(yy,"legend"); } legend_attr* S* ">" S* inline* "</" _LEGEND ">" S* { endtag(yy); }
TABLE <- S* "<" _TABLE & ET { tagb(yy,"table"); } TABLE_attr* S* ">" S* TABLE_flow "</" _TABLE ">" S* { endtag(yy); }
CAPTION <- S* "<" _CAPTION & ET { tagb(yy,"caption"); } attrs* S* ">" S* inline* "</" _CAPTION ">" S* { endtag(yy); }
COL <- S* "<" _COL & ET { tagb(yy,"col"); } col_attr* S* ">" S* ("</" _COL ">" S*)? { endtag(yy); }
COLGROUP <- S* "<" _COLGROUP & ET { tagb(yy,"colgroup"); } col_attr* S* ">" S* COL* ("</" _COLGROUP ">" S*)? { endtag(yy); }
THEAD <- S* "<" _THEAD & ET { tagb(yy,"thead"); } tr_attr* S* ">" S* TR+ ("</" _THEAD ">" S*)? { endtag(yy); }
TFOOT <- S* "<" _TFOOT & ET { tagb(yy,"tfoot"); } tr_attr* S* ">" S* TR+ ("</" _TFOOT ">" S*)? { endtag(yy); }
TR <- S* "<" _TR & ET { tagb(yy,"tr"); } tr_attr* S* ">" S* (TH / TD)+ ("</" _TR ">" S*)? { endtag(yy); }
TH <- S* "<" _TH & ET { tagb(yy,"th"); } THD_attr* S* ">" S* flow* ("</" _TH ">" S*)? { endtag(yy); }
TD <- S* "<" _TD & ET { tagb(yy,"td"); } THD_attr* S* ">" S* flow* ("</" _TD ">" S*)? { endtag(yy); }
bINS <- S* "<" _INS & ET { tagb(yy,"ins"); } INSDEL_attr* S* ">" S* flow* "</" _INS ">" S* { endtag(yy); }
bDEL <- S* "<" _DEL & ET { tagb(yy,"del"); } INSDEL_attr* S* ">" S* flow* "</" _DEL ">" S* { endtag(yy); }
#------------------------------------------------------
# TBODY opening and closing tag are optional. Lovely.
#------------------------------------------------------
TBODY <- (S* "<" _TBODY & ET { tagb(yy,"tbody"); } tr_attr* S* ">" S* / { tagb(yy,"tbody"); })
TR+
(S* "</" _TBODY ">" S*)? { endtag(yy); }
PRE <- S* "<" _PRE & ET { tagb(yy,"pre"); yy->pre = true; } attrs* S* ">"
((" " / "\t")* "\r"? "\n")?
PRE_flow*
"</" _PRE ">" S* { endtag(yy); yy->pre = false; }
bq_flow <- block / SCRIPT
PRE_flow <- ! (IMG / OBJECT / BIG / SMALL / SUB / SUP) inline
FORM_flow <- ! FORM (block / SCRIPT)
fs_flow <- LEGEND/ flow / PCDATA
TABLE_flow <- CAPTION? (COL / COLGROUP)* THEAD? TFOOT? TBODY+
# *******************************************
# Attributes
# *******************************************
_defval <- ( S* "=" S* _value / nil)
_value <- '"' { luaL_buffinit(yy->L,&yy->buf); } (! '"' CHAR)* { luaL_pushresult(&yy->buf); } '"'
/ "'" { luaL_buffinit(yy->L,&yy->buf); } (! "'" CHAR)* { luaL_pushresult(&yy->buf); } "'"
/ { luaL_buffinit(yy->L,&yy->buf); } (! S CHAR)* { luaL_pushresult(&yy->buf); }
attrs <- coreattrs / i18n / events
coreattrs <- attr_id / attr_class / attr_style / attr_title
i18n <- attr_lang / attr_dir
events <- attr_onclick / attr_ondblclick / attr_onmousedown
/ attr_onmouseup / attr_onmouseover / attr_onmousemove
/ attr_onmouseout / attr_onkeypress / attr_onkeydown
/ attr_onkeyup
reserved <- attr_datasrc / attr_datafld
cellhalign <- attr_align / attr_char / attr_charoff
cellvalign <- attr_valign
A_attr <- attrs
/ attr_charset / attr_type / attr_name / attr_href
/ attr_hreflang / attr_rel / attr_rev / attr_accesskey
/ attr_shape / attr_coords / attr_tabindex / attr_onfocus
/ attr_onblur
IMG_attr <- attrs
/ attr_src / attr_alt / attr_longdesc / attr_name
/ attr_height / attr_width / attr_usemap / attr_ismap
BDO_attr <- coreattrs / attr_lang / attr_dir
Q_attr <- attrs / attr_cite
MAP_attr <- attrs / attr_name
INSDEL_attr <- attrs / attr_cite / attr_datetime
AREA_attr <- attrs
/ attr_shape / attr_coords / attr_href
/ attr_nohref / attr_alt / attr_tabindex
/ attr_accesskey / attr_onfocus / attr_onblur
FONT_attr <- coreattrs / i18n
/ attr_size / attr_color / attr_face
PARAM_attr <- attr_id / attr_name / attr_value / attr_valuetype
/ attr_type
OBJECT_attr <- attrs
/ attr_declare / attr_classid / attr_codebase / attr_data
/ attr_type / attr_codetype / attr_archive / attr_standby
/ attr_height / attr_width / attr_usemap / attr_name
/ attr_tabindex / reserved
SCRIPT_attr <- events
/ attr_charset / attr_type / attr_src
/ attr_defer / attr_for / attr_event
INPUT_attr <- attrs
/ attr_type / attr_name / attr_value / attr_checked
/ attr_disabled / attr_readonly / attr_size / attr_maxlength
/ attr_src / attr_alt / attr_usemap / attr_ismap
/ attr_tabindex / attr_accesskey / attr_onfocus / attr_onblur
/ attr_onselect / attr_onchange / attr_accept / reserved
SELECT_attr <- attrs
/ attr_name / attr_size / attr_multiple / attr_disabled
/ attr_tabindex / attr_onfocus / attr_onblur / attr_onchange
/ reserved
TEXTAREA_attr <- attrs
/ attr_name / attr_rows / attr_cols / attr_disabled
/ attr_readonly / attr_tabindex / attr_accesskey / attr_onfocus
/ attr_onblur / attr_onselect / attr_onchange / reserved
LABEL_attr <- attrs
/ attr_for / attr_accesskey / attr_onfocus / attr_onblur
BUTTON_attr <- attrs
/ attr_name / attr_value / attr_type2
/ attr_disabled / attr_tabindex / attr_accesskey
/ attr_onfocus / attr_onblur / reserved
OPTGROUP_attr <- attrs / attr_disabled / attr_label OPTION_attr <- attrs
/ attr_selected / attr_disabled / attr_label / attr_value
FORM_attr <- attrs
/ attr_action / attr_method / attr_enctype / attr_accept
/ attr_name / attr_onsubmit / attr_onreset / attr_accept_charset
TABLE_attr <- attrs
/ attr_abbr / attr_axis / attr_headers / attr_scope
/ attr_rowspan / attr_colspan / cellhalign / cellvalign
/ attr_summary / attr_rules / attr_frame / attr_datapagesize
/ attr_cellspacing / attr_cellpadding / attr_border
bq_attr <- attrs / attr_cite
div_attr <- attrs / reserved
OL_attr <- attrs / attr_start / attr_type
legend_attr <- attrs / attr_accesskey
col_attr <- attrs / attr_span / attr_width / cellhalign / cellvalign
tr_attr <- attrs / cellhalign / cellvalign
THD_attr <- attrs
/ attr_abbr / attr_axis / attr_headers / attr_scope
/ attr_rowspan / attr_colspan / cellhalign / cellvalign
ET <- " " / "\t" / "\r" / "\n" / ">" # end tag
EA <- " " / "\t" / "\r" / "\n" / "=" / ">" # end attribute
EQ <- S* "=" S*
_vDIR <- EQ ('"' _LTR '"' / "'" _LTR "'" / _LTR) { lua_pushliteral(yy->L,"ltr"); }
/ EQ ('"' _RTL '"' / "'" _RTL "'" / _RTL) { lua_pushliteral(yy->L,"rtl"); }
_vALIGN <- EQ ('"' _ALIGN '"' / "'" _ALIGN "'" / _ALIGN ) { lua_pushliteral(yy->L,"align"); }
/ EQ ('"' _LEFT '"' / "'" _LEFT "'" / _LEFT ) { lua_pushliteral(yy->L,"left"); }
/ EQ ('"' _CENTER '"' / "'" _CENTER "'" / _CENTER ) { lua_pushliteral(yy->L,"center"); }
/ EQ ('"' _RIGHT '"' / "'" _RIGHT "'" / _RIGHT ) { lua_pushliteral(yy->L,"right"); }
/ EQ ('"' _JUSTIFY '"' / "'" _JUSTIFY "'" / _JUSTIFY) { lua_pushliteral(yy->L,"justify"); }
/ EQ ('"' _CHAR '"' / "'" _CHAR "'" / _CHAR ) { lua_pushliteral(yy->L,"char"); }
_vCHECKED <- EQ ('"' _CHECKED '"' / "'" _CHECKED "'" / _CHECKED) { lua_pushliteral(yy->L,"checked"); }
/ { lua_pushliteral(yy->L,"checked"); }
_vDECLARE <- EQ ('"' _DECLARE '"' / "'" _DECLARE "'" / _DECLARE) { lua_pushliteral(yy->L,"declare"); }
/ { lua_pushliteral(yy->L,"declare"); }
_vDEFER <- EQ ('"' _DEFER '"' / "'" _DEFER "'" / _DEFER) { lua_pushliteral(yy->L,"defer"); }
/ { lua_pushliteral(yy->L,"defer"); }
_vDISABLED <- EQ ('"' _DISABLED '"' / "'" _DISABLED "'" / _DISABLED) { lua_pushliteral(yy->L,"disabled"); }
/ { lua_pushliteral(yy->L,"disabled"); }
_vFRAME <- EQ ('"' _VOID '"' / "'" _VOID "'" / _VOID ) { lua_pushliteral(yy->L,"void"); }
/ EQ ('"' _ABOVE '"' / "'" _ABOVE "'" / _ABOVE ) { lua_pushliteral(yy->L,"above"); }
/ EQ ('"' _BELOW '"' / "'" _BELOW "'" / _BELOW ) { lua_pushliteral(yy->L,"below"); }
/ EQ ('"' _HSIDES '"' / "'" _HSIDES "'" / _HSIDES) { lua_pushliteral(yy->L,"hsides"); }
/ EQ ('"' _LHS '"' / "'" _LHS "'" / _LHS ) { lua_pushliteral(yy->L,"lhs"); }
/ EQ ('"' _RHS '"' / "'" _RHS "'" / _RHS ) { lua_pushliteral(yy->L,"rhs"); }
/ EQ ('"' _VSIDES '"' / "'" _VSIDES "'" / _VSIDES) { lua_pushliteral(yy->L,"vsides"); }
/ EQ ('"' _BOX '"' / "'" _BOX "'" / _BOX ) { lua_pushliteral(yy->L,"box"); }
/ EQ ('"' _BORDER '"' / "'" _BORDER "'" / _BORDER) { lua_pushliteral(yy->L,"border"); }
_vISMAP <- EQ ('"' _ISMAP '"' / "'" _ISMAP "'" / _ISMAP) { lua_pushliteral(yy->L,"ismap"); }
/ { lua_pushliteral(yy->L,"ismap"); }
_vMETHOD <- EQ ('"' _GET '"' / "'" _GET "'" / _GET ) { lua_pushliteral(yy->L,"GET"); }
/ EQ ('"' _POST '"' / "'" _POST "'" / _POST) { lua_pushliteral(yy->L,"POST"); }
_vMULTIPLE <- EQ ('"' _MULTIPLE '"' / "'" _MULTIPLE "'" / _MULTIPLE) { lua_pushliteral(yy->L,"multiple"); }
/ { lua_pushliteral(yy->L,"multiple"); }
_vNOHREF <- EQ ('"' _NOHREF '"' / "'" _NOHREF "'" / _NOHREF) { lua_pushliteral(yy->L,"nohref"); }
/ { lua_pushliteral(yy->L,"nohref"); }
_vREADONLY <- EQ ('"' _READONLY '"' / "'" _READONLY "'" / _READONLY) { lua_pushliteral(yy->L,"readonly"); }
/ { lua_pushliteral(yy->L,"readonly"); }
_vRULES <- EQ ('"' _NONE '"' / "'" _NONE "'" / _NONE ) { lua_pushliteral(yy->L,"none"); }
/ EQ ('"' _GROUPS '"' / "'" _GROUPS "'" / _GROUPS) { lua_pushliteral(yy->L,"groups"); }
/ EQ ('"' _ROWS '"' / "'" _ROWS "'" / _ROWS ) { lua_pushliteral(yy->L,"rows"); }
/ EQ ('"' _COLS '"' / "'" _COLS "'" / _COLS ) { lua_pushliteral(yy->L,"cols"); }
/ EQ ('"' _ALL '"' / "'" _ALL "'" / _ALL ) { lua_pushliteral(yy->L,"all"); }
_vSELECTED <- EQ ('"' _SELECTED '"' / "'" _SELECTED "'" / _SELECTED) { lua_pushliteral(yy->L,"selected"); }
/ { lua_pushliteral(yy->L,"selected"); }
_vTYPE2 <- EQ ('"' _BUTTON '"' / "'" _BUTTON "'" / _BUTTON) { lua_pushliteral(yy->L,"button"); }
/ EQ ('"' _SUBMIT '"' / "'" _SUBMIT "'" / _SUBMIT) { lua_pushliteral(yy->L,"submit"); }
/ EQ ('"' _RESET '"' / "'" _RESET "'" / _RESET ) { lua_pushliteral(yy->L,"reset"); }
_vVALIGN <- EQ ('"' _TOP '"' / "'" _TOP "'" / _TOP ) { lua_pushliteral(yy->L,"top"); }
/ EQ ('"' _MIDDLE '"' / "'" _MIDDLE "'" / _MIDDLE ) { lua_pushliteral(yy->L,"middle"); }
/ EQ ('"' _BOTTOM '"' / "'" _BOTTOM "'" / _BOTTOM ) { lua_pushliteral(yy->L,"bottom"); }
/ EQ ('"' _BASELINE '"' / "'" _BASELINE "'" / _BASELINE) { lua_pushliteral(yy->L,"baseline"); }
_vVALUETYPE <- EQ ('"' _DATA '"' / "'" _DATA "'" / _DATA ) { lua_pushliteral(yy->L,"DATA"); }
/ EQ ('"' _REF '"' / "'" _REF "'" / _REF ) { lua_pushliteral(yy->L,"REF"); }
/ EQ ('"' _OBJECT '"' / "'" _OBJECT "'" / _OBJECT) { lua_pushliteral(yy->L,"OBJECT"); }
_vnum <- EQ '"' < [0-9]+ > '"' { lua_pushinteger(yy->L,strtoul(yytext,NULL,10)); }
/ EQ "'" < [0-9]+ > "'" { lua_pushinteger(yy->L,strtoul(yytext,NULL,10)); }
/ EQ [0-9]+ > { lua_pushinteger(yy->L,strtoul(yytext,NULL,10)); }
attr_abbr <- S+ _ABBR & EA _defval { setfield(yy,"abbr"); }
attr_accept <- S+ _ACCEPT & EA _defval { setfield(yy,"accept"); }
attr_accept_charset <- S+ _ACCEPT_CHARSET & EA _defval { setfield(yy,"accept_charset"); }
attr_accesskey <- S+ _ACCESSKEY & EA _defval { setfield(yy,"accesskey"); }
attr_action <- S+ _ACTION & EA _defval { setfield(yy,"action"); }
attr_align <- S+ _ALIGN & EA _vALIGN { setfield(yy,"align"); }
attr_alt <- S+ _ALT & EA _defval { setfield(yy,"alt"); }
attr_archive <- S+ _ARCHIVE & EA _defval { setfield(yy,"archive"); }
attr_axis <- S+ _AXIS & EA _defval { setfield(yy,"axis"); }
attr_border <- S+ _BORDER & EA _defval { setfield(yy,"border"); }
attr_cellpadding <- S+ _CELLPADDING & EA _defval { setfield(yy,"cellpadding"); }
attr_cellspacing <- S+ _CELLSPACING & EA _defval { setfield(yy,"cellspacing"); }
attr_char <- S+ _CHAR & EA _defval { setfield(yy,"char"); }
attr_charoff <- S+ _CHAROFF & EA _defval { setfield(yy,"charoff"); }
attr_charset <- S+ _CHARSET & EA _defval { setfield(yy,"charset"); }
attr_checked <- S+ _CHECKED & EA _vCHECKED { setfield(yy,"checked"); }
attr_cite <- S+ _CITE & EA _defval { setfield(yy,"cite"); }
attr_class <- S+ _CLASS & EA _defval { setfield(yy,"class"); }
attr_classid <- S+ _CLASSID & EA _defval { setfield(yy,"classid"); }
attr_codebase <- S+ _CODEBASE & EA _defval { setfield(yy,"codebase"); }
attr_codetype <- S+ _CODETYPE & EA _defval { setfield(yy,"codetype"); }
attr_color <- S+ _COLOR & EA _defval { setfield(yy,"color"); }
attr_cols <- S+ _COLS & EA _vnum { setfield(yy,"cols"); }
attr_colspan <- S+ _COLSPAN & EA _vnum { setfield(yy,"colspan"); }
attr_coords <- S+ _COORDS & EA _defval { setfield(yy,"coords"); }
attr_data <- S+ _DATA & EA _defval { setfield(yy,"data"); }
attr_datafld <- S+ _DATAFLD & EA _defval { setfield(yy,"datafld"); }
attr_datapagesize <- S+ _DATAPAGESIZE & EA _defval { setfield(yy,"datapagesize"); }
attr_datasrc <- S+ _DATASRC & EA _defval { setfield(yy,"datasrc"); }
attr_datetime <- S+ _DATETIME & EA _defval { setfield(yy,"datetime"); }
attr_declare <- S+ _DECLARE & EA _vDECLARE { setfield(yy,"declare"); }
attr_defer <- S+ _DEFER & EA _vDEFER { setfield(yy,"defer"); }
attr_dir <- S+ _DIR & EA _vDIR { setfield(yy,"dir"); }
attr_disabled <- S+ _DISABLED & EA _vDISABLED { setfield(yy,"disabled"); }
attr_enctype <- S+ _ENCTYPE & EA _defval { setfield(yy,"enctype"); }
attr_event <- S+ _EVENT & EA _defval { setfield(yy,"event"); }
attr_face <- S+ _FACE & EA _defval { setfield(yy,"face"); }
attr_for <- S+ _FOR & EA _defval { setfield(yy,"for"); }
attr_frame <- S+ _FRAME & EA _vFRAME { setfield(yy,"frame"); }
attr_headers <- S+ _HEADERS & EA _defval { setfield(yy,"headers"); }
attr_height <- S+ _HEIGHT & EA _defval { setfield(yy,"height"); }
attr_href <- S+ _HREF & EA _defval { setfield(yy,"href"); }
attr_hreflang <- S+ _HREFLANG & EA _defval { setfield(yy,"hreflang"); }
attr_id <- S+ _ID & EA _defval { setfield(yy,"id"); }
attr_ismap <- S+ _ISMAP & EA _vISMAP { setfield(yy,"ismap"); }
attr_label <- S+ _LABEL & EA _defval { setfield(yy,"label"); }
attr_lang <- S+ _LANG & EA _defval { setfield(yy,"lang"); }
attr_longdesc <- S+ _LONGDESC & EA _defval { setfield(yy,"longdesc"); }
attr_maxlength <- S+ _MAXLENGTH & EA _vnum { setfield(yy,"maxlength"); }
attr_method <- S+ _METHOD & EA _vMETHOD { setfield(yy,"method"); }
attr_multiple <- S+ _MULTIPLE & EA _vMULTIPLE { setfield(yy,"multiple"); }
attr_name <- S+ _NAME & EA _defval { setfield(yy,"name"); }
attr_nohref <- S+ _NOHREF & EA _vNOHREF { setfield(yy,"nohref"); }
attr_onblur <- S+ _ONBLUR & EA _defval { setfield(yy,"onblur"); }
attr_onchange <- S+ _ONCHANGE & EA _defval { setfield(yy,"onchange"); }
attr_onclick <- S+ _ONCLICK & EA _defval { setfield(yy,"onclick"); }
attr_ondblclick <- S+ _ONDBLCLICK & EA _defval { setfield(yy,"ondblclick"); }
attr_onfocus <- S+ _ONFOCUS & EA _defval { setfield(yy,"onfocus"); }
attr_onkeydown <- S+ _ONKEYDOWN & EA _defval { setfield(yy,"onkeydown"); }
attr_onkeypress <- S+ _ONKEYPRESS & EA _defval { setfield(yy,"onkeypress"); }
attr_onkeyup <- S+ _ONKEYUP & EA _defval { setfield(yy,"onkeyup"); }
attr_onmousedown <- S+ _ONMOUSEDOWN & EA _defval { setfield(yy,"onmousedown"); }
attr_onmousemove <- S+ _ONMOUSEMOVE & EA _defval { setfield(yy,"onmousemove"); }
attr_onmouseout <- S+ _ONMOUSEOUT & EA _defval { setfield(yy,"onmouseout"); }
attr_onmouseover <- S+ _ONMOUSEOVER & EA _defval { setfield(yy,"onmouseover"); }
attr_onmouseup <- S+ _ONMOUSEUP & EA _defval { setfield(yy,"onmouseup"); }
attr_onreset <- S+ _ONRESET & EA _defval { setfield(yy,"onreset"); }
attr_onselect <- S+ _ONSELECT & EA _defval { setfield(yy,"onselect"); }
attr_onsubmit <- S+ _ONSUBMIT & EA _defval { setfield(yy,"onsubmit"); }
attr_readonly <- S+ _READONLY & EA _vREADONLY { setfield(yy,"readonly"); }
attr_rel <- S+ _REL & EA _defval { setfield(yy,"rel"); }
attr_rev <- S+ _REV & EA _defval { setfield(yy,"rev"); }
attr_rows <- S+ _ROWS & EA _vnum { setfield(yy,"rows"); }
attr_rowspan <- S+ _ROWSPAN & EA _vnum { setfield(yy,"rowspan"); }
attr_rules <- S+ _RULES & EA _vRULES { setfield(yy,"rules"); }
attr_scope <- S+ _SCOPE & EA _defval { setfield(yy,"scope"); }
attr_selected <- S+ _SELECTED & EA _vSELECTED { setfield(yy,"selected"); }
attr_shape <- S+ _SHAPE & EA _defval { setfield(yy,"shape"); }
attr_size <- S+ _SIZE & EA _defval { setfield(yy,"size"); }
attr_span <- S+ _SPAN & EA _vnum { setfield(yy,"span"); }
attr_src <- S+ _SRC & EA _defval { setfield(yy,"src"); }
attr_standby <- S+ _STANDBY & EA _defval { setfield(yy,"standby"); }
attr_start <- S+ _START & EA _vnum { setfield(yy,"start"); }
attr_style <- S+ _STYLE & EA _defval { setfield(yy,"style"); }
attr_summary <- S+ _SUMMARY & EA _defval { setfield(yy,"summary"); }
attr_tabindex <- S+ _TABINDEX & EA _vnum { setfield(yy,"tabindex"); }
attr_title <- S+ _TITLE & EA _defval { setfield(yy,"title"); }
attr_type <- S+ _TYPE & EA _defval { setfield(yy,"type"); }
attr_type2 <- S+ _TYPE2 & EA _vTYPE2 { setfield(yy,"type2"); }
attr_usemap <- S+ _USEMAP & EA _defval { setfield(yy,"usemap"); }
attr_valign <- S+ _VALIGN & EA _vVALIGN { setfield(yy,"valign"); }
attr_value <- S+ _VALUE & EA _defval { setfield(yy,"value"); }
attr_valuetype <- S+ _VALUETYPE & EA _vVALUETYPE { setfield(yy,"valuetype"); }
attr_width <- S+ _WIDTH & EA _defval { setfield(yy,"width"); }
# ****************************
_A <- 'a'
_ABBR <- 'abbr'
_ABOVE <- 'above'
_ACCEPT <- 'accept'
_ACCEPT_CHARSET <- 'accept_charset'
_ACCESSKEY <- 'accesskey'
_ACRONYM <- 'acronym'
_ACTION <- 'action'
_ADDRESS <- 'address'
_ALIGN <- 'align'
_ALL <- 'all'
_ALT <- 'alt'
_ARCHIVE <- 'archive'
_AREA <- 'area'
_AXIS <- 'axis'
_B <- 'b'
_BASELINE <- 'baseline'
_BDO <- 'bdo'
_BELOW <- 'below'
_BIG <- 'big'
_BLOCKQUOTE <- 'blockquote'
_BORDER <- 'border'
_BOTTOM <- 'bottom'
_BOX <- 'box'
_BR <- 'br'
_BUTTON <- 'button'
_CAPTION <- 'caption'
_CELLPADDING <- 'cellpadding'
_CELLSPACING <- 'cellspacing'
_CENTER <- 'center'
_CHAR <- 'char'
_CHAROFF <- 'charoff'
_CHARSET <- 'charset'
_CHECKED <- 'checked'
_CITE <- 'cite'
_CLASS <- 'class'
_CLASSID <- 'classid'
_CODE <- 'code'
_CODEBASE <- 'codebase'
_CODETYPE <- 'codetype'
_COL <- 'col'
_COLGROUP <- 'colgroup'
_COLOR <- 'color'
_COLS <- 'cols'
_COLSPAN <- 'colspan'
_COORDS <- 'coords'
_DATA <- 'data'
_DATAFLD <- 'datafld'
_DATAPAGESIZE <- 'datapagesize'
_DATASRC <- 'datasrc'
_DATETIME <- 'datetime'
_DD <- 'dd'
_DECLARE <- 'declare'
_DEFER <- 'defer'
_DEL <- 'del'
_DFN <- 'dfn'
_DIR <- 'dir'
_DISABLED <- 'disabled'
_DIV <- 'div'
_DL <- 'dl'
_DT <- 'dt'
_EM <- 'em'
_ENCTYPE <- 'enctype'
_EVENT <- 'event'
_FACE <- 'face'
_FIELDSET <- 'fieldset'
_FONT <- 'font'
_FOR <- 'for'
_FORM <- 'form'
_FRAME <- 'frame'
_GET <- 'get'
_GROUPS <- 'groups'
_H1 <- 'h1'
_H2 <- 'h2'
_H3 <- 'h3'
_H4 <- 'h4'
_H5 <- 'h5'
_H6 <- 'h6'
_HEADERS <- 'headers'
_HEIGHT <- 'height'
_HR <- 'hr'
_HREF <- 'href'
_HREFLANG <- 'hreflang'
_HSIDES <- 'hsides'
_I <- 'i'
_ID <- 'id'
_IMG <- 'img'
_INPUT <- 'input'
_INS <- 'ins'
_ISMAP <- 'ismap'
_JUSTIFY <- 'justify'
_KBD <- 'kbd'
_LABEL <- 'label'
_LANG <- 'lang'
_LEFT <- 'left'
_LEGEND <- 'legend'
_LHS <- 'lhs'
_LI <- 'li'
_LONGDESC <- 'longdesc'
_LTR <- 'ltr'
_MAP <- 'map'
_MAXLENGTH <- 'maxlength'
_METHOD <- 'method'
_MIDDLE <- 'middle'
_MULTIPLE <- 'multiple'
_NAME <- 'name'
_NOHREF <- 'nohref'
_NONE <- 'none'
_NOSCRIPT <- 'noscript'
_OBJECT <- 'object'
_OL <- 'ol'
_ONBLUR <- 'onblur'
_ONCHANGE <- 'onchange'
_ONCLICK <- 'onclick'
_ONDBLCLICK <- 'ondblclick'
_ONFOCUS <- 'onfocus'
_ONKEYDOWN <- 'onkeydown'
_ONKEYPRESS <- 'onkeypress'
_ONKEYUP <- 'onkeyup'
_ONMOUSEDOWN <- 'onmousedown'
_ONMOUSEMOVE <- 'onmousemove'
_ONMOUSEOUT <- 'onmouseout'
_ONMOUSEOVER <- 'onmouseover'
_ONMOUSEUP <- 'onmouseup'
_ONRESET <- 'onreset'
_ONSELECT <- 'onselect'
_ONSUBMIT <- 'onsubmit'
_OPTGROUP <- 'optgroup'
_OPTION <- 'option'
_P <- 'p'
_PARAM <- 'param'
_POST <- 'post'
_PRE <- 'pre'
_Q <- 'q'
_READONLY <- 'readonly'
_REF <- 'ref'
_REL <- 'rel'
_RESET <- 'reset'
_REV <- 'rev'
_RHS <- 'rhs'
_RIGHT <- 'right'
_ROWS <- 'rows'
_ROWSPAN <- 'rowspan'
_RTL <- 'rtl'
_RULES <- 'rules'
_SAMP <- 'samp'
_SCOPE <- 'scope'
_SCRIPT <- 'script'
_SELECT <- 'select'
_SELECTED <- 'selected'
_SHAPE <- 'shape'
_SIZE <- 'size'
_SMALL <- 'small'
_SPAN <- 'span'
_SRC <- 'src'
_STANDBY <- 'standby'
_START <- 'start'
_STRONG <- 'strong'
_STYLE <- 'style'
_SUB <- 'sub'
_SUBMIT <- 'submit'
_SUMMARY <- 'summary'
_SUP <- 'sup'
_TABINDEX <- 'tabindex'
_TABLE <- 'table'
_TBODY <- 'tbody'
_TD <- 'td'
_TEXTAREA <- 'textarea'
_TFOOT <- 'tfoot'
_TH <- 'th'
_THEAD <- 'thead'
_TITLE <- 'title'
_TOP <- 'top'
_TR <- 'tr'
_TT <- 'tt'
_TYPE <- 'type'
_TYPE2 <- 'type2'
_U <- 'u'
_UL <- 'ul'
_USEMAP <- 'usemap'
_VALIGN <- 'valign'
_VALUE <- 'value'
_VALUETYPE <- 'valuetype'
_VAR <- 'var'
_VOID <- 'void'
_VSIDES <- 'vsides'
_WIDTH <- 'width'
# ***********************************
# Misc definitions
# ***********************************
Cinline <- S* "<!--" ___comment_start ___comment_data* ___comment_stop
Cblock <- S* "<!--" ___comment_start ___comment_data* ___comment_stop S*
___comment_start <- {
lua_createtable(yy->L,0,0);
luaL_buffinit(yy->L,&yy->buf);
}
___comment_data <- < ! "-->" . > { luaL_addchar(&yy->buf,*yytext); }
___comment_stop <- "-->"
{
luaL_pushresult(&yy->buf);
lua_setfield(yy->L,-2,"comment");
lua_pushinteger(yy->L,luaL_len(yy->L,-2) + 1);
lua_insert(yy->L,-2);
lua_settable(yy->L,-3);
}
PCDATA <- {
luaL_buffinit(yy->L,&yy->buf);
}
(! "<" CHAR)+
{
luaL_pushresult(&yy->buf);
lua_pushinteger(yy->L,luaL_len(yy->L,-2) + 1);
lua_insert(yy->L,-2);
lua_settable(yy->L,-3);
}
scriptDATA <- {
luaL_buffinit(yy->L,&yy->buf);
}
(!("</" _SCRIPT ">") CHAR)*
{
luaL_pushresult(&yy->buf);
lua_pushinteger(yy->L,luaL_len(yy->L,-2) + 1);
lua_insert(yy->L,-2);
lua_settable(yy->L,-3);
}
CHAR <- "&#x" < HEXDIG+ > ";" { deentifyn(yy,yytext,16); }
/ "&#X" < HEXDIG+ > ";" { deentifyn(yy,yytext,16); }
/ "&#" < DIGIT+ > ";" { deentifyn(yy,yytext,10); }
/ "&" < [A-Za-z0-9]+ > ";" { deentify(yy,yytext); }
/ < S+ > {
if (yy->pre)
luaL_addlstring(&yy->buf,yytext,yyleng);
else
luaL_addchar(&yy->buf,' ');
} # handle PRE
/ < . > { luaL_addchar(&yy->buf,*yytext); }
DIGIT <- [0-9]
HEXDIG <- [0-9A-Fa-f]
nil <- { lua_pushliteral(yy->L,""); }
S <- " " / "\t" / "\r" / "\n" &{ linecnt(yy) }
.
you're on gopher.conman.org^70/0Gopher:Ext:mod_blog/html.peg
back link is gopher.conman.org:70/1Gopher:Ext:mod_blog/